package com.hon.legionnaire.negocio.dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;

import com.hon.legionnaire.negocio.vo.CompraVO;
import com.hon.legionnaire.negocio.vo.ContaPagarVO;
import com.hon.legionnaire.negocio.vo.ContaReceberVO;
import com.hon.legionnaire.negocio.vo.VendaVO;

@Service("contaReceberDao")
public class ContaReceberDAO {
	
	@PersistenceContext
	private EntityManager entityManager;

	
	public void inserirContaReceber(ContaReceberVO contaReceberVO) {
		try {
			entityManager.persist(contaReceberVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir a conta a receber: " + e.getMessage(), e);
		}
	}
	
	
	public void atualizarContaReceber(ContaReceberVO contaReceberVO) {
		try {
			entityManager.merge(contaReceberVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao atualizar a conta a receber: " + e.getMessage(), e);
		}
	}

	
	public void removerContaReceber(ContaReceberVO contaReceberVO) {
		try {
			if (!entityManager.contains(contaReceberVO)) {
				contaReceberVO = entityManager.merge(contaReceberVO);
			}
			entityManager.remove(contaReceberVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover a conta a receber: " + e.getMessage(), e);
		}
	}

	
	public ContaReceberVO obterContaReceber(ContaReceberVO contaReceberVO) {
		try {
			return entityManager.find(ContaReceberVO.class, contaReceberVO.getCodigo());
		} catch (Exception e) {
			throw new RuntimeException("Erro ao buscar a conta a receber: " + e.getMessage(), e);
		}
	}


	@SuppressWarnings("unchecked")
	public List<ContaReceberVO> obterListaContaReceber() {
		try {
			List<ContaReceberVO> lista = (List<ContaReceberVO>) entityManager.createNamedQuery("loadAllContaReceber").getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar as contas a receber.", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	public boolean validaDuplicado(ContaReceberVO contaReceberVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedContaReceber");
		query.setParameter("descricao", contaReceberVO.getDescricao());
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	
	@SuppressWarnings("unchecked")
	public boolean pesquisaContaReceber(VendaVO venda){
		Query query = entityManager.createNamedQuery("findContaReceberByVendaPagas");
		query.setParameter("codigoVenda", venda.getCodigo());
		ArrayList<ContaReceberVO> lista = (ArrayList<ContaReceberVO>)query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	
	@SuppressWarnings("unchecked")
	public ArrayList<ContaReceberVO> obterListaContaReceber(VendaVO venda) {
		Query query = entityManager.createNamedQuery("loadAllContaReceberByVenda");
		query.setParameter("codvenda", venda.getCodigo());
		ArrayList<ContaReceberVO> lista = (ArrayList<ContaReceberVO>)query.getResultList();
		if (lista.isEmpty()) {
			return null;
		} else {
			return lista;
		}
	}
}
